/*
 * Copyright (c) 2015-2020, www.dibo.ltd (service@dibo.ltd).
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * <p>
 * https://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.icesoft.framework.core.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
import com.gitee.sunchenbin.mybatis.actable.constants.MySqlTypeConstant;
import com.icesoft.framework.core.config.Cons;
import com.icesoft.framework.core.util.BeanUtils;
import com.icesoft.framework.core.util.ContextHelper;
import com.icesoft.framework.core.util.JSON;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.Map;

/**
 * Entity基础父类
 */
@Getter
@Setter
@Accessors(chain = true)
public abstract class BaseEntity extends AbstractEntity {
	private static final long serialVersionUID = 10203L;

	@TableId(type = IdType.ASSIGN_ID)
	@Column(value = "id", comment = "主键ID")
	protected Long id;

	@TableField
	@Column(value = "editable", comment = "是否可编辑")
	protected boolean editable = true;
	/**
	 * 默认记录创建时间字段，新建时由数据库赋值
	 */
	@JsonFormat
	@TableField(fill = FieldFill.INSERT)
	@Column(value = "create_time", comment = "创建时间", defaultValue = "CURRENT_TIMESTAMP", type = MySqlTypeConstant.TIMESTAMP)
	private Date createTime;

	@JsonFormat
	@TableField(fill = FieldFill.INSERT_UPDATE)
	@Column(value = "update_time", comment = "更新时间", type = MySqlTypeConstant.TIMESTAMP)
	private Date updateTime;

	public Long getId() {
		return id;
	}

	public BaseEntity setId(Long id) {
		this.id = id;
		return this;
	}

	/***
	 * Entity对象转为map
	 * @return
	 */
	public Map<String, Object> toMap() {
		String jsonStr = JSON.stringify(this);
		return JSON.toMap(jsonStr);
	}

	/**
	 * 获取主键值
	 *
	 * @return
	 */
	@JsonIgnore
	public Object getPrimaryKeyVal() {
		String pk = ContextHelper.getIdFieldName(this.getClass());
		if (pk == null) {
			return null;
		}
		if (Cons.FieldName.id.name().equals(pk)) {
			return getId();
		}
		return BeanUtils.getProperty(this, pk);
	}
}